﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using AssessmentTool.PresentationLogic.Controllers;
using AdminApplication.Controls;
using AdminApplication.PresentationLogic.EventArguments;
using AssessmentTool.Services.DTO;
using AssessmentTool.PresentationLogic;
using AssessmentTool.Services;
using AssessmentTool.PresentationLogic.EventArguments;

using AdminApplication.ServiceBridge;
using System.Collections.Generic;
using AssessmentTool;
using System.Text;
using System.ComponentModel;

namespace AdminApplication.PresentationLogic.Controllers
{
    public class PanelUserActionsController : AbstractController<PanelUserActions>
    {
        private List<DTOUtente> listSelected = new List<DTOUtente>();
        public PanelUserActionsController(PanelUserActions element)
            : base(element)
        {
            ed.subscrive("USERSELECTED", userSelected);
            ed.subscrive("LOGOUT", logout);
            ed.subscrive("SHOWINSERTUSER", logout);
            ed.subscrive("DELETEUSER", deleteUtenti);
            
        }
        public void logout(EventArgs e)
        {
            element.Visibility = Visibility.Collapsed;
        }
        public void userSelected(EventArgs e)
        {
            UsersSelectedEventArg arg = (UsersSelectedEventArg)e;
            listSelected = new List<DTOUtente>();
            element.TipoExport.SelectedIndex = -1;
            if (arg.args.Count == 1)
            {
                
                DTOUtente utente = arg.args[0].Utente;
                listSelected.Add(utente);
                element.Username.Text = utente.Username;
                element.Nome.Text = utente.Nome;
                element.Cognome.Text = utente.Cognome;
                element.Visibility = Visibility.Visible;
                
                element.ProfiliCSV.IsEnabled = utente.Stato.CompareTo("DRAFT")!=0;
                element.ProfiliExcel.IsEnabled = utente.Stato.CompareTo("DRAFT") != 0;
                element.Visualizza.IsEnabled = true;
                element.editButton.IsEnabled = true;
                if (utente.Stato == "CONSOLIDATO")
                    element.validaButton.IsEnabled = true;
                else
                    element.validaButton.IsEnabled = false;
                element.UsernameLabel.Visibility = Visibility.Visible;
            }
            else
            {
                Boolean tuttiConProfilo = true;
                
                foreach(UserSelectedEventArg u in arg.args)
                {
                    listSelected.Add(u.Utente);
                    if (u.Utente.Stato.CompareTo("DRAFT")==0)
                        tuttiConProfilo = false;
                }
                element.validaButton.IsEnabled = false;
                element.Visualizza.IsEnabled = false;
                element.editButton.IsEnabled = false;
                element.deleteButton.IsEnabled = true;
                element.ProfiliCSV.IsEnabled = tuttiConProfilo;
                element.ProfiliExcel.IsEnabled = tuttiConProfilo;
                element.Nome.Text = "N/A";
                element.Cognome.Text = "N/A";
                element.UsernameLabel.Visibility = Visibility.Collapsed;
                element.Username.Text = "Hai selezionato "+arg.args.Count+" utenti";
            }
        }
        public void exportCSVProfili()
        {
            ed.dispatch("BUSY", new EventArgs());
            UtenteAdminServiceBridge.getProfiliInfo(listSelected, stampaProfiliCSV);

        }
        public void exportExcelProfili()
        {
            ed.dispatch("BUSY", new EventArgs());
            UtenteAdminServiceBridge.getProfiliInfoExcel(listSelected, stampaProfiliExcel);

        }
        public void stampaProfiliCSV(object sender, getProfiliInfoFromUsersCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore critico nella richiesta...", Critico = false, Error = true });
            }
            else
            {
                ModalWindow ew = new ModalWindow();
                
                StringBuilder sb=CSVProfiliBuilder.getCSVProfilo(e.Result);
                StringEventArgs arg = new StringEventArgs() { stringbuilder = sb };

                ew.Show("Export completato!", "Vuoi salvare il file?", ModalType.YESNO, "SAVECSV", arg);
                ed.dispatch("STOPBUSY", new EventArgs());
            }
        }
        
        public void stampaProfiliExcel(object sender, getProfiliUtentiExcelCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore critico nella richiesta...", Critico = false, Error = true });
            }
            else
            {
                ModalWindow ew = new ModalWindow();
                FileDownloadedEventArgs arg = new FileDownloadedEventArgs() { file = e.Result };

                ew.Show("Export completato!", "Vuoi salvare il file?", ModalType.YESNO, "SAVEEXCEL", arg);
                ed.dispatch("STOPBUSY", new EventArgs());
            }
        }
        
        public void validaUtente(bool modifica)
        {
            UtenteLogged logged = (UtenteLogged)Session.getInstance().getValue("USERLOGGED");
            logged.grantVisualizzaProfilo = true;
            if (modifica)
            {
                logged.grantModificaModello = true;
            }
            else
            {
                logged.grantModificaModello = false;
            }
            ed.dispatch("BUSY", new EventArgs());
            UtenteAdminServiceBridge.getUser(listSelected[0], validaUtente);
        }
        public void validaUtente(object sender, getUtenteCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore nel reperimento dell'utente...", Critico = false, Error = true });

            }
            else
            {
                Session.getInstance().updateValue("USER", e.Result.utente);
                ed.dispatch("USERSELECTEDVALIDATION", null);
            }
        }




        public void deleteUtenti(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore nell'eliminazione dell'utente...", Critico = false, Error = true });

            }
            else
            {

                ed.dispatch("REFRESHLIST", null);
            }
        }
        public void deleteUtenti()
        {
            ed.dispatch("BUSY", new EventArgs());
             ModalWindow ew = new ModalWindow();
            ew.Show("Eliminazione Utente","Vuoi davvero eliminare gli utenti selezionati ("+listSelected.Count+")?", ModalType.YESNO, "DELETEUSER", null);
        }
        public void deleteUtenti(EventArgs e)
        {
            UtenteAdminServiceBridge.deleteUtente(listSelected, deleteUtenti);
        }
    }
}
